package com.lzleang.saxreader;

import com.lzleang.model.Student;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import java.util.ArrayList;
import java.util.List;

public class SAXReaderHandler extends DefaultHandler {
    //创建一个student集合用于存储数据
    private List<Student> students ;
    private Student student;
    private String tag;  //用来存储当前解析的标签名字


    //每开始解析一次xml文件就会调用一次
    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
        students = new ArrayList<Student>();
        System.out.println("开始已SAX的方式解析文档");
    }

    //每次结束解析是会进行调用
    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
        System.out.println("sax的文档解析已结束");
    }


    /**
     *
     * @param uri：命名空间
     * @param localName :不带前缀的标签名  <a:person person_id="p1"> -->获取的是person
     * @param qName：带前缀的标签名 <a:person person_id="p1"> -->获取的是a:person
     * @param attributes：当前标签属性 <a:person person_id="p1">
     * @throws SAXException
     */
    //每一个标签开始时调用
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
        System.out.println("标签<"+qName + ">解析开始");
        //是否解析到了student标签
        if("student".equals(qName)){
        student = new Student();
        for(int i = 0 ; i < attributes.getLength();i++){
            if(attributes.getLocalName(i).equals("id")){
                student.setId(Integer.parseInt(attributes.getValue(i)));
            }
        }
    }
        tag = qName;
}

    //每一个标签结束时调用
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
        System.out.println("标签</"+qName + ">解析结束");
        if("student".equals(qName)){
            students.add(student);
        }
        tag=null;
    }

    //当解析到标签中的内容的时候调用(换行也是文本内容)
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);
        String contents = new String(ch, start, length).trim();
        if (contents.length() > 0) {
            System.out.println("内容为-->" + contents);
        } else {
            System.out.println("内容为-->" + "空");
        }
        if("name".equals(tag)){
            student.setName(contents);
        }
        if("sex".equals(tag)){
            student.setSex(contents);
        }
        if("age".equals(tag)){
            student.setAge(Integer.parseInt(contents));
        }
    }

    //将解析完成的模型集合返回
    public List<Student> getStudents(){
        return students;
    }
}
